Lossless compression is used in systems as a way to reduce the amount of data that has to be read from or written back to a main memory. Compression works on segments of input data, typically of fixed size, which are compressed into smaller block sizes. Lossless compressions use segments of configurable sizes. An example would be compressing 256 byte segments into 64 byte blocks, 128 byte blocks, 192 byte blocks, or 256 byte blocks depending on the compression rate that the algorithm can achieve. This compressed data would then be stored in caches until it is written back to the main memory. Due to the nature of compression there can be unused holes in a physical address space of the cache. These holes can occur within a cache line. When the data is propagated through a cache with a larger cache line than the smallest compressed size multiple, overfetch of data from the cache to the main memory results.
When requesting a small sized block of data from the cache, the cache must fill the entire line, but due to the holes in compressed data, only a portion of that line will contain useful data as the holes in the cache line will be filled with irrelevant data. This results in overfetching by the cache to a main memory with part of the overfetch being garbage. For example if a segment is compressed to 64 bytes or 192 bytes and requested from a cache with 128 byte lines, then an extra 64 bytes of useless data will be loaded to the cache in each case to fill the hole in the cache line. In a good compression scheme, a large fraction of the compressed blocks will be the smallest size. Consequently the benefits of bandwidth compression are diminished and needless power is consumed fetching unnecessary data and writing back that random data.